package edu.ues21.tcs.ecommerce2011.mvc.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;
import edu.ues21.tcs.ecommerce2011.mvc.model.Articulo;
import edu.ues21.tcs.ecommerce2011.mvc.model.ArticuloPrecio;
import edu.ues21.tcs.ecommerce2011.mvc.model.Marca;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author eandre fmantaras
 */
@Transactional
public class ArticuloDAOImpl implements ArticuloDAO {

    // Declaro el hibernate template.iberna
    private HibernateTemplate hibernateTemplate;

    // Le seteo el sessionFactory que le inyecto al hibernateTemplate.
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.hibernateTemplate = new HibernateTemplate(sessionFactory);
        // this.sessionFactory = sessionFactory;
        // this.hibernateTemplate.setSessionFactory(sessionFactory);
    }

    public void save(Articulo articulo, Integer idMarca) {

        Marca marca = (Marca) hibernateTemplate.get(Marca.class, idMarca);
        System.out.println("Marca" + marca.getNombre());
        marca.addArticulo(articulo);
        // Persisto los cambios en la marca.
        hibernateTemplate.merge(articulo);

        hibernateTemplate.merge(marca);

    }

    public void delete(Integer idArticulo) {

        Articulo articulo = (Articulo) hibernateTemplate.get(Articulo.class, idArticulo);
        // Elimino el articulo de la tabla Articulo.
        hibernateTemplate.delete(articulo);

    }

    @SuppressWarnings("unchecked")
    @Transactional(readOnly = true)
    public List<Articulo> getAll() {

        return hibernateTemplate.find("from Articulo");
    }

    @SuppressWarnings("unchecked")
    @Transactional(readOnly = true)
    public List<Articulo> getAll(Integer marcaId) {
        return hibernateTemplate.find("from Articulo a where a.marca.idmarca=?", marcaId);
    }

    @SuppressWarnings("unchecked")
    @Transactional(readOnly = true)
    public List<Articulo> search(String buscar) {
        DetachedCriteria criteria = DetachedCriteria.forClass(Articulo.class);
        criteria.add(Restrictions.ilike("nombre", buscar));
        return hibernateTemplate.findByCriteria(criteria);
    }

    @SuppressWarnings("unchecked")
    @Transactional(readOnly = true)
    public int total() {

        List<Articulo> a = hibernateTemplate.find("from Articulo");
        return a.size();
    }

    @SuppressWarnings("unchecked")
    @Transactional(readOnly = true)
    public List<Articulo> getAllDistint(Integer idListaPrecio) {
        List<Articulo> listaA = hibernateTemplate.find("from Articulo");
        List<ArticuloPrecio> listaAP = hibernateTemplate.find("from ArticuloPrecio where listaprecio=" + idListaPrecio);
        List<Articulo> result = hibernateTemplate.find("from Articulo");

        for (ArticuloPrecio ap : listaAP) {
            for (Articulo a : listaA) {
                if (ap.getArticulo().getIdarticulo() == a.getIdarticulo()) {
                    result.remove(a);
                }
            }
        }

        return result;
    }

    @Transactional(readOnly = true)
    public Articulo getArticulo(Integer idArticulo) {

        return hibernateTemplate.get(Articulo.class, idArticulo);
    }
}
